package com.saver.core.processor;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.util.Log;

import com.saver.core.domain.MensajeTexto;
import com.saver.core.processor.comparator.StringComparator;

public class BCP implements ProcessorSMS {
	
	private static final String TAG = "ProcessorSMS-BCP";
	private static final String PATRON = "^(\\d*)/([a-z]*) (.*) (.*\\.)(\\-)?(\\d*\\.\\d*)$";
	private static final String SIGNO_GASTO = "-";
	
	private Map<String, Integer> meses = new TreeMap<String, Integer>(new StringComparator ());
	private int ultimoMes;
	
	public BCP() {
		meses.put("ene", 0);
		meses.put("feb", 1);
		meses.put("mar", 2);
		meses.put("abr", 3);
		meses.put("may", 4);
		meses.put("jun", 5);
		meses.put("jul", 6);
		meses.put("ago", 7);
		meses.put("set", 8);
		meses.put("sep", 8);
		meses.put("oct", 9);
		meses.put("nov", 10);
		meses.put("dic", 11);
	}

	@Override
	public TipoBanco tipoBanco () {
		return TipoBanco.BCP;
	}

	@Override
	public List<Token> process(MensajeTexto mensajeTexto) {
		ultimoMes = -1;
		String mensaje = mensajeTexto.getBody();
		ArrayList<Token> tokens = new ArrayList<Token> (3);
		String content = mensaje.substring(mensaje.indexOf(":")+1).trim();
		StringTokenizer tokenizer = new StringTokenizer(content, ",");
		while (tokenizer.hasMoreTokens()) {
			String texto = tokenizer.nextToken().trim();
			Log.d(TAG, "texto a procesar: " +  texto);
			
			Pattern p = Pattern.compile(PATRON);
			Matcher m = p.matcher(texto);
			if (m.find()) {
				Token token = new Token(TipoBanco.BCP, mensajeTexto.getDate());
				if (SIGNO_GASTO.equals(m.group(5))) {
					token.setTipoToken(TipoToken.EGRESO);
				} else {
					token.setTipoToken(TipoToken.INGRESO);
				}
				token.setFechaTransaccion(obtenerFecha(m.group(1), m.group(2), mensajeTexto.getDate(), tokens));
				token.setEstablecimiento(m.group(3));
				token.setMoneda(m.group(4));
				token.setImporte(Double.parseDouble(m.group(6)));
				
				tokens.add(token);
			}
		}
		return tokens;
	}

	private long obtenerFecha(String dia, String mes, long milisec, List<Token> tokens) {
		Date fechaMsg = new Date(milisec);
		int valDia = Integer.parseInt(dia);
		int valMes = meses.get(mes);
		int valAnioMsg = fechaMsg.getYear();
		
		if (ultimoMes > -1 && valMes < ultimoMes) {
			for (Token token : tokens) {
				Date actual = new Date(token.getFechaTransaccion());
				Date nuevo = new Date(actual.getYear()-1, actual.getMonth(), actual.getDate());
				token.setFechaTransaccion(nuevo.getTime());
			}
		}
		ultimoMes = valMes;
		
		Log.d(TAG, "dia: " + valDia + " / mes: " + ultimoMes + " / anio: " + valAnioMsg);
		
		return new Date(valAnioMsg, ultimoMes, valDia).getTime();
	}

	@Override
	public boolean isValid(String sms) {
		String txt = sms.substring(sms.indexOf(":")+1).trim();
		return validarSMSBCP (txt);
	}

//	@Override
//	public List<Transaccion> process(String sms, Date date) {
//		ArrayList<Transaccion> transaccions = new ArrayList<Transaccion> (5);
//		String content = sms.substring(sms.indexOf(":")+1).trim();
//		StringTokenizer tokenizer = new StringTokenizer(content, ",");
//		while (tokenizer.hasMoreTokens()) {
//			String token = tokenizer.nextToken().trim();
//			Log.d(TAG, "token:" +  token);
//			
//			Transaccion transaccion = new Transaccion();
//			transaccion = new Transaccion();
//			transaccion.setIdBanco(3);
//			transaccion.setIdCategoria(null);
//			transaccion.setCuenta("");
//			//transaccion.setFecha(date);
//			Double importe = extraerImporte(token);
//			transaccion.setMonto(importe);
//			String detalle = procesarBCP(token);
//			transaccion.setDetalle(detalle);
//			String establecimiento = obtenerNombreEstablecimiento(token);
//			//transaccion.setIdEstablecimiento(establecimiento);
//			transaccions.add(transaccion);
//		}
//		return transaccions;
//	}

	public boolean validarSMSBCP(String sms) {
		StringTokenizer tokenizer = new StringTokenizer(sms, ",");
		while (tokenizer.hasMoreTokens()) {
			String token = tokenizer.nextToken();
			boolean valido = Pattern.matches(PATRON, token);
			if (!valido) {
				return false;
			}
		}
		return true;
	}

	public String procesarBCP(String body) {
		String detalleGasto = "";
		Pattern p = Pattern.compile(PATRON);
		Matcher m = p.matcher(body);
		if (m.find()) {
			detalleGasto = m.group(3);

			Log.d(TAG, "Partes");
			for (int i=0; i<m.groupCount(); i++) {
				Log.d(TAG, "gr" + i + " ---::" + m.group(i));
			}
		}
		return detalleGasto;
	}

	public String obtenerNombreEstablecimiento(String body) {
		return null;
	}

	public Double extraerImporte(String sms) {
		String monto = "0";
		Pattern p = Pattern.compile(PATRON);
		Matcher m = p.matcher(sms);
		if (m.find()) {
			monto = m.group(6);
		}
		return Double.parseDouble(monto);
	}

}
